/**
 * @author 傻大
 * @Email jiangdragon@126.com | jiang_long@topsec.com.cn
 * @Time 2016/3/25
 */
com.plugin(function (com) {
    var util = com.color = com.color || {};
    // 颜色格式
    /*jshint maxlen: 330 */
    var colorRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i;
    var _nameColors = {
        aliceblue: "#f0f8ff",//爱丽丝蓝
        antiquewhite: "#faebd7",//古代的白色
        aqua: "#00FFFF",//水绿色
        aquamarine: "#7fffd4",//碧绿色
        azure: "#f0ffff",//蔚蓝色
        beige: "#f5f5dc",//米色(浅褐色)
        bisque: "#ffe4c4",//(浓汤)乳脂,番茄等
        black: "#000000",//纯黑
        blanchedalmond: "#ffebcd",//漂白的杏仁
        blue: "#0000ff",//纯蓝
        blueviolet: "#8a2be2",//深紫罗兰的蓝色
        brown: "#a52a2a",//棕色
        burlywood: "#deb887",
        cadetblue: "#5f9ea0",//军校蓝
        chartreuse: '#7fff00',
        chocolate: '#d2691e',
        coral: '#ff7f50',
        cornflowerblue: '#6495ed',
        cornsilk: '#fff8dc',
        crimson: '#dc143c',
        cyan: '#0ff',
        darkblue: '#00008b',
        darkcyan: '#008b8b',
        darkgoldenrod: '#b8860b',
        darkgray: '#a9a9a9',
        darkgrey: '#a9a9a9',
        darkgreen: '#006400',
        darkkhaki: '#bdb76b',
        darkmagenta: '#8b008b',
        darkolivegreen: '#556b2f',
        darkorange: '#ff8c00',
        darkorchid: '#9932cc',
        darkred: '#8b0000',
        darksalmon: '#e9967a',
        darkseagreen: '#8fbc8f',
        darkslateblue: '#483d8b',
        darkslategray: '#2f4f4f',
        darkslategrey: '#2f4f4f',
        darkturquoise: '#00ced1',
        darkviolet: '#9400d3',
        deeppink: '#ff1493',
        deepskyblue: '#00bfff',
        dimgray: '#696969',
        dimgrey: '#696969',
        dodgerblue: '#1e90ff',
        firebrick: '#b22222',
        floralwhite: '#fffaf0',
        forestgreen: '#228b22',
        fuchsia: '#f0f',
        gainsboro: '#dcdcdc',
        ghostwhite: '#f8f8ff',
        gold: '#ffd700',
        goldenrod: '#daa520',
        gray: '#808080',
        grey: '#808080',
        green: '#008000',
        greenyellow: '#adff2f',
        honeydew: '#f0fff0',
        hotpink: '#ff69b4',
        indianred: '#cd5c5c',
        indigo: '#4b0082',
        ivory: '#fffff0',
        khaki: '#f0e68c',
        lavender: '#e6e6fa',
        lavenderblush: '#fff0f5',
        lawngreen: '#7cfc00',
        lemonchiffon: '#fffacd',
        lightblue: '#add8e6',
        lightcoral: '#f08080',
        lightcyan: '#e0ffff',
        lightgoldenrodyellow: '#fafad2',
        lightgray: '#d3d3d3',
        lightgrey: '#d3d3d3',
        lightgreen: '#90ee90',
        lightpink: '#ffb6c1',
        lightsalmon: '#ffa07a',
        lightseagreen: '#20b2aa',
        lightskyblue: '#87cefa',
        lightslategray: '#789',
        lightslategrey: '#789',
        lightsteelblue: '#b0c4de',
        lightyellow: '#ffffe0',
        lime: '#0f0',
        limegreen: '#32cd32',
        linen: '#faf0e6',
        magenta: '#f0f',
        maroon: '#800000',
        mediumaquamarine: '#66cdaa',
        mediumblue: '#0000cd',
        mediumorchid: '#ba55d3',
        mediumpurple: '#9370d8',
        mediumseagreen: '#3cb371',
        mediumslateblue: '#7b68ee',
        mediumspringgreen: '#00fa9a',
        mediumturquoise: '#48d1cc',
        mediumvioletred: '#c71585',
        midnightblue: '#191970',
        mintcream: '#f5fffa',
        mistyrose: '#ffe4e1',
        moccasin: '#ffe4b5',
        navajowhite: '#ffdead',
        navy: '#000080',
        oldlace: '#fdf5e6',
        olive: '#808000',
        olivedrab: '#6b8e23',
        orange: '#ffa500',
        orangered: '#ff4500',
        orchid: '#da70d6',
        palegoldenrod: '#eee8aa',
        palegreen: '#98fb98',
        paleturquoise: '#afeeee',
        palevioletred: '#d87093',
        papayawhip: '#ffefd5',
        peachpuff: '#ffdab9',
        peru: '#cd853f',
        pink: '#ffc0cb',
        plum: '#dda0dd',
        powderblue: '#b0e0e6',
        purple: '#800080',
        red: '#f00',
        rosybrown: '#bc8f8f',
        royalblue: '#4169e1',
        saddlebrown: '#8b4513',
        salmon: '#fa8072',
        sandybrown: '#f4a460',
        seagreen: '#2e8b57',
        seashell: '#fff5ee',
        sienna: '#a0522d',
        silver: '#c0c0c0',
        skyblue: '#87ceeb',
        slateblue: '#6a5acd',
        slategray: '#708090',
        slategrey: '#708090',
        snow: '#fffafa',
        springgreen: '#00ff7f',
        steelblue: '#4682b4',
        tan: '#d2b48c',
        teal: '#008080',
        thistle: '#d8bfd8',
        tomato: '#ff6347',
        turquoise: '#40e0d0',
        violet: '#ee82ee',
        wheat: "#f5deb3",//小麦色
        white: "#fff",//纯白
        whitesmoke: "#f5f5f5",//白烟
        yellow: "#ff0",//纯黄
        yellowgreen: "#9acd32"
    };
    /**
     * 调整值区间
     * @param value {Int}
     * @param region{[0,255]}
     * @returns {Int}
     */
    function adjust(value, region) {
        if (value <= region[0]) {
            value = region[0];
        } else if (value >= region[1]) {
            value = region[1];
        }
        return value;
    }
    /**
     * 移除颜色中多余空格
     * @param {string} color 颜色
     * @return {string} 无空格颜色
     */
    function trim(color) {
        return String(color).replace(/\s+/g, '');
    }


    util.getRGB = function (colour) {
    };
    /**
     * 颜色规范化
     * @param {string} color 颜色
     * @return {string} 规范化后的颜色
     */
    util.normalize = function (color) {
        // 颜色名
        if (_nameColors[color]) {
            color = _nameColors[color];
        }
        // 去掉空格
        color = trim(color);
        // rgb转为rrggbb
        if (/^#[\da-f]{3}$/i.test(color)) {
            color = parseInt(color.slice(1), 16);
            var r = (color & 0xf00) << 8;
            var g = (color & 0xf0) << 4;
            var b = color & 0xf;
            color = '#' + ((1 << 24) + (r << 4) + r + (g << 4) + g + (b << 4) + b).toString(16).slice(1);
        }
        return color;
    };
    util.getData = function (color) {
        color = util.normalize(color);
        var r = color.match(colorRegExp);
        if (r === null) {
            throw new Error('The color format error'); // 颜色格式错误
        }
        var data = [], d, a;
        if (r[2]) {// #rrggbb
            d = r[2].replace("#", "").split("");
            data.push(adjust(parseInt(d[0] + d[1], 16), [0, 255]));
            data.push(adjust(parseInt(d[2] + d[3], 16), [0, 255]));
            data.push(adjust(parseInt(d[4] + d[5], 16), [0, 255]));
        } else if (r[4]) {// rgb rgba
            d = (r[4]).split(',');
            data.push(adjust(parseInt(d[0], 16), [0, 255]));
            data.push(adjust(parseInt(d[1], 16), [0, 255]));
            data.push(adjust(parseInt(d[2], 16), [0, 255]));
            if (typeof d[3] !== 'undefined') {
                data.push(adjust(parseFloat(d[3]), [0, 1]));
            }
        }
        return data;
    };
    /**
     * 颜色值数组转为指定格式颜色
     * @param data {[r,g,b,a]}
     * @param format {'rgba'}
     * @returns {string}
     */
    util.toColor = function (data, format) {
        format = format || "rgb";
        if (data && (data.length === 3 || data.length === 4)) {
            for (var i = 0, len = data.length; i < len; i++) {
                data[i] = data[i] > 1 ? Math.ceil(data[i]) : data[i];
            }

            if (format.indexOf("a") > -1) {
                if (data.length === 3) {
                    data.push(1);
                }
                data[3] = adjust(data[3], [0, 1]);
                return format + "(" + data.slice(0, 4).join(",") + ")";
            }
            return format + "(" + data.slice(0, 3).join(",") + ")";
        }
    };
    /**
     * 颜色翻转,[255-r,255-g,255-b,1-a]
     * @param {string} color 颜色
     * @return {string} 翻转颜色
     */
    util.reverse = function (color) {
        var data = util.getData(color);
        for (var i = 0, len = data.length; i < len; i++) {
            data[i] = 255 - data[i];
        }
        return util.toColor(data, "rgb");
    }

});